package org.huangrui.juc.source.atomic;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
 * 以一种线程安全的方式操作非线程安全对象的某些字段。
 * 需求：
 * 10个线程，
 * 每个线程转账1000，
 * 不使用synchronized,尝试使用AtomicIntegerFieldUpdater来实现。
 * @Author hr
 * @Create 2024-04-05 05:08
 */
public class T04_AtomicIntegerFieldUpdater {
    public static void main(String[] args) throws InterruptedException {
        BankAccount bankAccount = new BankAccount();
        CountDownLatch downLatch = new CountDownLatch(10);
        for (int i = 1; i <= 10; i++) {
            new Thread(() ->{
               for (int j = 1; j <= 1000; j++) {
                    // bankAccount.add();
                   bankAccount.transMoney(bankAccount);
               }
               downLatch.countDown();
            },String.valueOf(i)).start();
        }
        downLatch.await();
         System.out.println(Thread.currentThread().getName()+"\t -----come in "+ bankAccount.money);
    }
}
class BankAccount{
    String bankName = "CCB";
    //更新的对象属性必须使用 public volatile 修饰符。
    public volatile int money = 0;//钱数

    public synchronized void add()
    {
        money++;
    }

    //因为对象的属性修改类型原子类都是抽象类，所以每次使用都必须
    // 使用静态方法newUpdater()创建一个更新器，并且需要设置想要更新的类和属性。
   AtomicIntegerFieldUpdater<BankAccount> fieldUpdater = AtomicIntegerFieldUpdater.newUpdater(BankAccount.class,"money");
    //不加synchronized，保证高性能原子性，局部微创小手术
    public void transMoney(BankAccount bankAccount){
        fieldUpdater.getAndIncrement(bankAccount);
    }
}